package com.lyy.document.controller;

import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import com.lyy.common.utils.*;
import com.lyy.common.utils.excel.ExcelUtils;
import com.lyy.common.utils.jxls.JxlsExport;
import com.lyy.document.pojo.DocDocumentHistory;
import com.lyy.document.service.DocDocumentHistoryService;
import org.apache.commons.lang3.StringUtils;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;

import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.InputStream;
import java.util.*;

/**
 * 文件历史记录(DocDocumentHistory)表控制层
 *
 * @author Yw
 * @since 2021-02-01 17:23:48
 */
@RestController
@RequestMapping("/docDocumentHistory")
public class DocDocumentHistoryController {
    /**
     * 服务对象
     */
    @Resource
    private DocDocumentHistoryService docDocumentHistoryService;

    /**
     * 创建文件历史记录
     * /docDocumentHistory/createDocDocumentHistory
     * { "name":"文档名称",  "sort":"排序",  "type":"文档类型，字典doc_type",  "content":"内容",  "createDate":"创建时间",  "parentId":"父级id",  "projectId":"项目id",  "comment":"备注",  "userId":"用户id",  "docId":"文档id" }
     *
     * @param name       文档名称
     * @param sort       排序
     * @param type       文档类型，字典doc_type
     * @param content    内容
     * @param createDate 创建时间
     * @param parentId   父级id
     * @param projectId  项目id
     * @param comment    备注
     * @param userId     用户id
     * @param docId      文档id
     * @return
     */
    @PostMapping("/createDocDocumentHistory")
    public Map<String, Object> createDocDocumentHistory(DocDocumentHistory docDocumentHistory) {
        AssertUtils.notNull(docDocumentHistory.getName(), "文档名称不能为空");
        AssertUtils.notNull(docDocumentHistory.getSort(), "排序不能为空");
        AssertUtils.notNull(docDocumentHistory.getType(), "文档类型，字典doc_type不能为空");
        AssertUtils.notNull(docDocumentHistory.getContent(), "内容不能为空");
        AssertUtils.notNull(docDocumentHistory.getCreateDate(), "创建时间不能为空");
        AssertUtils.notNull(docDocumentHistory.getParentId(), "父级id不能为空");
        AssertUtils.notNull(docDocumentHistory.getProjectId(), "项目id不能为空");
        AssertUtils.notNull(docDocumentHistory.getComment(), "备注不能为空");
        AssertUtils.notNull(docDocumentHistory.getUserId(), "用户id不能为空");
        AssertUtils.notNull(docDocumentHistory.getDocId(), "文档id不能为空");
        docDocumentHistoryService.createDocDocumentHistory(docDocumentHistory);
        return ResultUtils.getResult(ResultInfo.SUCCESS);
    }

    /**
     * 根据主键修改文件历史记录
     * /docDocumentHistory/updateDocDocumentHistory
     * { "id":"文档操作记录id",  "name":"文档名称",  "sort":"排序",  "type":"文档类型，字典doc_type",  "content":"内容",  "createDate":"创建时间",  "parentId":"父级id",  "projectId":"项目id",  "comment":"备注",  "userId":"用户id",  "docId":"文档id" }
     *
     * @param id         文档操作记录id
     * @param name       文档名称
     * @param sort       排序
     * @param type       文档类型，字典doc_type
     * @param content    内容
     * @param createDate 创建时间
     * @param parentId   父级id
     * @param projectId  项目id
     * @param comment    备注
     * @param userId     用户id
     * @param docId      文档id
     * @return
     */
    @PutMapping("/updateDocDocumentHistory")
    public Map<String, Object> updateDocDocumentHistory(DocDocumentHistory docDocumentHistory) {
        AssertUtils.notNull(docDocumentHistory.getId(), "文档操作记录id不能为空");
        AssertUtils.notNull(docDocumentHistory.getName(), "文档名称不能为空");
        AssertUtils.notNull(docDocumentHistory.getSort(), "排序不能为空");
        AssertUtils.notNull(docDocumentHistory.getType(), "文档类型，字典doc_type不能为空");
        AssertUtils.notNull(docDocumentHistory.getContent(), "内容不能为空");
        AssertUtils.notNull(docDocumentHistory.getCreateDate(), "创建时间不能为空");
        AssertUtils.notNull(docDocumentHistory.getParentId(), "父级id不能为空");
        AssertUtils.notNull(docDocumentHistory.getProjectId(), "项目id不能为空");
        AssertUtils.notNull(docDocumentHistory.getComment(), "备注不能为空");
        AssertUtils.notNull(docDocumentHistory.getUserId(), "用户id不能为空");
        AssertUtils.notNull(docDocumentHistory.getDocId(), "文档id不能为空");
        docDocumentHistoryService.updateDocDocumentHistory(docDocumentHistory);
        return ResultUtils.getResult(ResultInfo.SUCCESS);
    }

    /**
     * 根据主键获取单个文件历史记录
     * /docDocumentHistory/getDocDocumentHistory
     * { "id":"文档操作记录id" }
     *
     * @param id 文档操作记录id
     * @return
     */
    @GetMapping("/getDocDocumentHistory")
    public Map<String, Object> getDocDocumentHistory(DocDocumentHistory docDocumentHistory) {
        AssertUtils.notNull(docDocumentHistory.getId(), "文档操作记录id不能为空");
        DocDocumentHistory entity = docDocumentHistoryService.getDocDocumentHistory(docDocumentHistory);
        Map<String, Object> map = new HashMap<String, Object>();
        map.put("docDocumentHistory", entity);
        return ResultUtils.getResult(ResultInfo.SUCCESS, "", map);
    }


    /**
     * 根据主键删除文件历史记录
     * /docDocumentHistory/deleteDocDocumentHistory
     * { "id":"文档操作记录id" }
     *
     * @param id 文档操作记录id
     * @return
     */
    @DeleteMapping("/deleteDocDocumentHistory")
    public Map<String, Object> deleteDocDocumentHistory(DocDocumentHistory docDocumentHistory) {
        AssertUtils.notNull(docDocumentHistory.getId(), "文档操作记录id不能为空");
        docDocumentHistoryService.deleteDocDocumentHistory(docDocumentHistory);
        return ResultUtils.getResult(ResultInfo.SUCCESS);
    }

    /**
     * 查询文件历史记录列表
     * /docDocumentHistory/selectDocDocumentHistoryList
     * { "id":"文档操作记录id",  "name":"文档名称",  "sort":"排序",  "type":"文档类型，字典doc_type",  "content":"内容",  "createDate":"创建时间",  "parentId":"父级id",  "projectId":"项目id",  "comment":"备注",  "userId":"用户id",  "docId":"文档id" }
     *
     * @param id         文档操作记录id
     * @param name       文档名称
     * @param sort       排序
     * @param type       文档类型，字典doc_type
     * @param content    内容
     * @param createDate 创建时间
     * @param parentId   父级id
     * @param projectId  项目id
     * @param comment    备注
     * @param userId     用户id
     * @param docId      文档id
     * @return
     */
    @GetMapping("/selectDocDocumentHistoryList")
    public Map<String, Object> selectDocDocumentHistoryList(DocDocumentHistory docDocumentHistory) {
        List<DocDocumentHistory> docDocumentHistorys = docDocumentHistoryService.selectDocDocumentHistoryList(docDocumentHistory);
        Map<String, Object> map = new HashMap<String, Object>();
        map.put("docDocumentHistorys", docDocumentHistorys);
        return ResultUtils.getResult(ResultInfo.SUCCESS, "", map);
    }

    /**
     * 查询文件历史记录列表
     * /docDocumentHistory/selectDocDocumentHistoryCount
     * { "id":"文档操作记录id", "name":"文档名称", "sort":"排序", "type":"文档类型，字典doc_type", "content":"内容", "createDate":"创建时间", "parentId":"父级id", "projectId":"项目id", "comment":"备注", "userId":"用户id", "docId":"文档id"}
     *
     * @param id         文档操作记录id
     * @param name       文档名称
     * @param sort       排序
     * @param type       文档类型，字典doc_type
     * @param content    内容
     * @param createDate 创建时间
     * @param parentId   父级id
     * @param projectId  项目id
     * @param comment    备注
     * @param userId     用户id
     * @param docId      文档id
     * @return
     */
    @GetMapping("/selectDocDocumentHistoryCount")
    public Map<String, Object> selectDocDocumentHistoryCount(DocDocumentHistory docDocumentHistory) {
        int count = docDocumentHistoryService.selectDocDocumentHistoryCount(docDocumentHistory);
        Map<String, Object> map = new HashMap<String, Object>();
        map.put("count", count);
        return ResultUtils.getResult(ResultInfo.SUCCESS, "", map);
    }


    /**
     * 查询文件历史记录列表分页
     * /docDocumentHistory/selectDocDocumentHistoryPage
     * { "id":"文档操作记录id",  "name":"文档名称",  "sort":"排序",  "type":"文档类型，字典doc_type",  "content":"内容",  "createDate":"创建时间",  "parentId":"父级id",  "projectId":"项目id",  "comment":"备注",  "userId":"用户id",  "docId":"文档id" ,"pageNum":"页码","pageSize":"条数"}
     *
     * @param pageNum    页码
     * @param pageSize   页数
     * @param id         文档操作记录id
     * @param name       文档名称
     * @param sort       排序
     * @param type       文档类型，字典doc_type
     * @param content    内容
     * @param createDate 创建时间
     * @param parentId   父级id
     * @param projectId  项目id
     * @param comment    备注
     * @param userId     用户id
     * @param docId      文档id
     * @return
     */
    @GetMapping("/selectDocDocumentHistoryPage")
    public Map<String, Object> selectDocDocumentHistoryPage(DocDocumentHistory docDocumentHistory, Integer pageNum, Integer pageSize) {
        AssertUtils.notNull(pageNum, "页码不能为空!");
        AssertUtils.notNull(pageSize, "条数不能为空!");
        PageHelper.startPage(pageNum, pageSize);
        List<DocDocumentHistory> docDocumentHistorys = docDocumentHistoryService.selectDocDocumentHistoryList(docDocumentHistory);
        PageInfo<DocDocumentHistory> pageInfo = new PageInfo<>(docDocumentHistorys);
        Map<String, Object> map = new HashMap<String, Object>();
        map.put("pageInfo", pageInfo);
        return ResultUtils.getResult(ResultInfo.SUCCESS, "", map);
    }


    /**
     * 导出文件历史记录
     * /docDocumentHistory/exportDocDocumentHistoryExcel
     * { "id":"文档操作记录id",  "name":"文档名称",  "sort":"排序",  "type":"文档类型，字典doc_type",  "content":"内容",  "createDate":"创建时间",  "parentId":"父级id",  "projectId":"项目id",  "comment":"备注",  "userId":"用户id",  "docId":"文档id" }
     *
     * @param id         文档操作记录id
     * @param name       文档名称
     * @param sort       排序
     * @param type       文档类型，字典doc_type
     * @param content    内容
     * @param createDate 创建时间
     * @param parentId   父级id
     * @param projectId  项目id
     * @param comment    备注
     * @param userId     用户id
     * @param docId      文档id
     * @return
     */
    @GetMapping("/exportDocDocumentHistoryExcel")
    public void exportDocDocumentHistoryExcel(HttpServletRequest request, HttpServletResponse response, DocDocumentHistory docDocumentHistory) {
        List<DocDocumentHistory> docDocumentHistorys = docDocumentHistoryService.selectDocDocumentHistoryList(docDocumentHistory);
        if (CommonUtils.isNotEmpty(docDocumentHistorys)) {
            List<String> titles = new ArrayList<>();
            titles.add(" 序号 ");
            titles.add(" 文档名称 ");
            titles.add(" 排序 ");
            titles.add(" 文档类型，字典doc_type ");
            titles.add(" 内容 ");
            titles.add(" 创建时间 ");
            titles.add(" 父级id ");
            titles.add(" 项目id ");
            titles.add(" 备注 ");
            titles.add(" 用户id ");
            titles.add(" 文档id ");
            List<List<String>> values = new ArrayList<>();
            int k = 0;
            for (DocDocumentHistory entity : docDocumentHistorys) {
                List<String> value = new ArrayList<>();
                value.add((++k) + "");
                value.add(entity.getName());
                value.add(entity.getSort() + "");
                value.add(entity.getType());
                value.add(entity.getContent());
                value.add(DateUtils.formatDate(entity.getCreateDate()));
                value.add(entity.getParentId());
                value.add(entity.getProjectId());
                value.add(entity.getComment());
                value.add(entity.getUserId());
                value.add(entity.getDocId());
                values.add(value);
            }
            String address = Constants.address + "/wisdom/template/customTemplate.xls";
            String excelName = "文件历史记录.xls";
            Map<String, Object> beans = new HashMap<>();
            beans.put("titles", titles);
            beans.put("values", values);
            beans.put("date", DateUtils.formatDateTime(new Date()));
            JxlsExport.export(request, response, beans, excelName, address);
        }
    }


    /**
     * /docDocumentHistory/importDocDocumentHistoryExcel  从excel表导入文件历史记录
     * 导入excel文件
     * {"file":"excel文件"}
     *
     * @param file excel文件
     */
    @PostMapping("/importDocDocumentHistoryExcel")
    public Map<String, Object> importDocDocumentHistoryExcel(MultipartFile file) {
        if (file.isEmpty()) {
            return ResultUtils.getResult(ResultInfo.UPLOAD_NOT_EXISTS);
        }
        // 文件名称
        String fileName = file.getOriginalFilename();
        if (StringUtils.isBlank(fileName)) {
            return ResultUtils.getResult(ResultInfo.UPLOAD_NOT_EXISTS);
        }
        try {
            InputStream inputStream = file.getInputStream();
            //创建工作簿
            Workbook wb = null;
            //判断表格格式
            if (fileName.toLowerCase().endsWith("xls")) {
                wb = new HSSFWorkbook(inputStream);
            } else if (fileName.toLowerCase().endsWith("xlsx")) {
                wb = new XSSFWorkbook(inputStream);
            } else {
                return ResultUtils.getResult(ResultInfo.UPLOAD_TYPE_ERROR);
            }
            List<DocDocumentHistory> docDocumentHistorys = new ArrayList<>();
            List<Map<String, String>> resultMap = new ArrayList<>();
            Map<String, String> result = null;
            DocDocumentHistory docDocumentHistory = null;
            // 获取工作表的第一个Sheet
            Sheet hssfSheet = wb.getSheetAt(0);
            if (hssfSheet != null) {
                int index = -1;
                for (int rowNum = 0; rowNum <= hssfSheet.getLastRowNum(); rowNum++) {
                    Row hssfRow = hssfSheet.getRow(rowNum);
                    if (hssfRow != null) {
                        if (ExcelUtils.getValue(hssfRow.getCell(0)).contains("文档名称") &&
                                ExcelUtils.getValue(hssfRow.getCell(1)).contains("排序") &&
                                ExcelUtils.getValue(hssfRow.getCell(2)).contains("文档类型，字典doc_type") &&
                                ExcelUtils.getValue(hssfRow.getCell(3)).contains("内容") &&
                                ExcelUtils.getValue(hssfRow.getCell(4)).contains("创建时间") &&
                                ExcelUtils.getValue(hssfRow.getCell(5)).contains("父级id") &&
                                ExcelUtils.getValue(hssfRow.getCell(6)).contains("项目id") &&
                                ExcelUtils.getValue(hssfRow.getCell(7)).contains("备注") &&
                                ExcelUtils.getValue(hssfRow.getCell(8)).contains("用户id") &&
                                ExcelUtils.getValue(hssfRow.getCell(9)).contains("文档id")) {
                            index = ++rowNum;
                            break;
                        }
                    }
                }

                if (index == -1) {
                    result = new HashMap<>();
                    result.put("reason", "excel模板不正确");
                    result.put("status", "1");
                    resultMap.add(result);
                    Map<String, Object> map = new HashMap<>();
                    map.put("resultMap", resultMap);
                    return ResultUtils.getResult(ResultInfo.SUCCESS, "", map);
                }

                // 循环行Row
                for (int rowNum = index; rowNum <= hssfSheet.getLastRowNum(); rowNum++) {
                    Row hssfRow = hssfSheet.getRow(rowNum);
                    if (hssfRow != null) {
                        if (StringUtils.isBlank(ExcelUtils.getValue(hssfRow.getCell(0))) &&
                                StringUtils.isBlank(ExcelUtils.getValue(hssfRow.getCell(1))) &&
                                StringUtils.isBlank(ExcelUtils.getValue(hssfRow.getCell(2))) &&
                                StringUtils.isBlank(ExcelUtils.getValue(hssfRow.getCell(3))) &&
                                StringUtils.isBlank(ExcelUtils.getValue(hssfRow.getCell(4))) &&
                                StringUtils.isBlank(ExcelUtils.getValue(hssfRow.getCell(5))) &&
                                StringUtils.isBlank(ExcelUtils.getValue(hssfRow.getCell(6))) &&
                                StringUtils.isBlank(ExcelUtils.getValue(hssfRow.getCell(7))) &&
                                StringUtils.isBlank(ExcelUtils.getValue(hssfRow.getCell(8))) &&
                                StringUtils.isBlank(ExcelUtils.getValue(hssfRow.getCell(9)))) {
                            continue;
                        }
                        docDocumentHistory = new DocDocumentHistory();
                        String name = ExcelUtils.getValue(hssfRow.getCell(0));//文档名称
                        if (StringUtils.isBlank(name)) {
                            result = new HashMap<>();
                            result.put("reason", "文档名称不能为空！");
                            result.put("status", "1");
                            resultMap.add(result);
                            continue;
                        }
                        docDocumentHistory.setName(name);
                        String sort = ExcelUtils.getValue(hssfRow.getCell(1));//排序
                        if (StringUtils.isBlank(sort)) {
                            result = new HashMap<>();
                            result.put("reason", "排序不能为空！");
                            result.put("status", "1");
                            resultMap.add(result);
                            continue;
                        }
                        docDocumentHistory.setSort(Integer.valueOf(sort));
                        String type = ExcelUtils.getValue(hssfRow.getCell(2));//文档类型，字典doc_type
                        if (StringUtils.isBlank(type)) {
                            result = new HashMap<>();
                            result.put("reason", "文档类型，字典doc_type不能为空！");
                            result.put("status", "1");
                            resultMap.add(result);
                            continue;
                        }
                        docDocumentHistory.setType(type);
                        String content = ExcelUtils.getValue(hssfRow.getCell(3));//内容
                        if (StringUtils.isBlank(content)) {
                            result = new HashMap<>();
                            result.put("reason", "内容不能为空！");
                            result.put("status", "1");
                            resultMap.add(result);
                            continue;
                        }
                        docDocumentHistory.setContent(content);
                        String createDate = ExcelUtils.getValue(hssfRow.getCell(4));//创建时间
                        if (StringUtils.isBlank(createDate)) {
                            result = new HashMap<>();
                            result.put("reason", "创建时间不能为空！");
                            result.put("status", "1");
                            resultMap.add(result);
                            continue;
                        }
                        docDocumentHistory.setCreateDate(DateUtils.formatDate(createDate));
                        String parentId = ExcelUtils.getValue(hssfRow.getCell(5));//父级id
                        if (StringUtils.isBlank(parentId)) {
                            result = new HashMap<>();
                            result.put("reason", "父级id不能为空！");
                            result.put("status", "1");
                            resultMap.add(result);
                            continue;
                        }
                        docDocumentHistory.setParentId(parentId);
                        String projectId = ExcelUtils.getValue(hssfRow.getCell(6));//项目id
                        if (StringUtils.isBlank(projectId)) {
                            result = new HashMap<>();
                            result.put("reason", "项目id不能为空！");
                            result.put("status", "1");
                            resultMap.add(result);
                            continue;
                        }
                        docDocumentHistory.setProjectId(projectId);
                        String comment = ExcelUtils.getValue(hssfRow.getCell(7));//备注
                        if (StringUtils.isBlank(comment)) {
                            result = new HashMap<>();
                            result.put("reason", "备注不能为空！");
                            result.put("status", "1");
                            resultMap.add(result);
                            continue;
                        }
                        docDocumentHistory.setComment(comment);
                        String userId = ExcelUtils.getValue(hssfRow.getCell(8));//用户id
                        if (StringUtils.isBlank(userId)) {
                            result = new HashMap<>();
                            result.put("reason", "用户id不能为空！");
                            result.put("status", "1");
                            resultMap.add(result);
                            continue;
                        }
                        docDocumentHistory.setUserId(userId);
                        String docId = ExcelUtils.getValue(hssfRow.getCell(9));//文档id
                        if (StringUtils.isBlank(docId)) {
                            result = new HashMap<>();
                            result.put("reason", "文档id不能为空！");
                            result.put("status", "1");
                            resultMap.add(result);
                            continue;
                        }
                        docDocumentHistory.setDocId(docId);
                        docDocumentHistorys.add(docDocumentHistory);
                    }
                }
                if (CommonUtils.isNotEmpty(docDocumentHistorys)) {
                    resultMap.addAll(docDocumentHistoryService.importDocDocumentHistoryExcel(docDocumentHistorys));
                }
            }
            inputStream.close();
            Map<String, Object> map = new HashMap<>();
            map.put("resultMap", resultMap);
            return ResultUtils.getResult(ResultInfo.SUCCESS, "", map);
        } catch (IOException e) {
            e.printStackTrace();
        } catch (Exception e) {
            e.printStackTrace();
            return ResultUtils.getResult(ResultInfo.ERROR);
        }
        return ResultUtils.getResult(ResultInfo.FAILED);
    }
}